序列化数据

    如果程序与端对端间的交互是使用 ObjectOutputStream 和
    ObjectInputStream,并且主要面临的问题是兼容性,那么,
    JDK 序列化 是不错的选择。

    表8.8列出了序列化类,Netty 提供了与 JDK 的互操作。

    Table 8.8 JDK Serialization codecs

    如果可以使用外部依赖 JBoss Marshalling 是个明智的选择。比 JDK 序列化快3倍且更加简练。

    下表展示了 Netty 支持 JBoss Marshalling 的编解码器。

    Table 8.9 JBoss Marshalling codecs

    MarshallingEncoder
    MarshallingEncoder | 使用自定义序列化用于编码,必须使用
    MarshallingDecoder

    下面展示了使用 MarshallingDecoder 和 MarshallingEncoder

    ProtoBuf 来自谷歌,并且开源了。它使编解码数据更加紧凑和高效。它已经绑定各种编程语言,使它适合跨语言项目。

    下表展示了 Netty 支持 ProtoBuf 的 ChannelHandler 实现。

    Table 8.10 ProtoBuf codec

    用法见下面

    1. private final MessageLite lite;
    2. public ProtoBufInitializer(MessageLite lite) {
    3. this.lite = lite;
    4. protected void initChannel(Channel ch) throws Exception {
    5. ChannelPipeline pipeline = ch.pipeline();
    6. pipeline.addLast(new ProtobufVarint32FrameDecoder());
    7. pipeline.addLast(new ProtobufEncoder());
    8. pipeline.addLast(new ProtobufDecoder(lite));
    9. pipeline.addLast(new ObjectHandler());
    10. }
    11. public static final class ObjectHandler extends SimpleChannelInboundHandler<Object> {
    12. @Override
    13. public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
    14. // Do something with the object
    15. }
    16. }
    17. }
    1. 添加 ProtobufVarint32FrameDecoder 用来分割帧
    2. 添加 ProtobufEncoder 用来处理消息的编码
    3. 添加 ObjectHandler 用来处理解码了的消息

    本章在这最后一节中,我们探讨了 Netty 支持的不同的序列化的专门的解码器和编码器。这些是标准 JDK 序列化 API,JBoss Marshalling 和谷歌ProtoBuf。